#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
/**
 * @brief 主函数，用于解决合并物品的最小成本问题
 *
 * 该函数通过优先队列（最小堆）来模拟合并物品的过程，
 * 每次取出最小的两个物品合并，并将合并后的物品重新加入队列，
 * 直到队列中只剩下一个物品，最终计算出合并的最小成本。
 *
 * @return 程序正常结束返回 0
 */
int main() {
    // 定义一个最小堆优先队列 q，用于存储物品的重量
    // priority_queue<ll, vector<ll>, greater<ll>> 表示使用 long long 类型，存储在 vector 中，以小顶堆的方式排序
    priority_queue<ll, vector<ll>, greater<ll>> q;
    // 定义一个整数变量 n，用于存储物品的数量
    int n;
    // 从标准输入读取物品的数量 n
    cin >> n;
    // 定义一个整数向量 a，大小为 n，用于临时存储输入的物品重量
    vector<int> a(n);
    // 遍历向量 a，将每个元素依次赋值给变量 e
    for (auto &e: a) {
        // 从标准输入读取一个物品的重量，并赋值给 e
        cin >> e;
        // 将物品的重量 e 加入最小堆优先队列 q 中
        q.push(e);
    }
    // 定义一个 long long 类型的变量 cost，用于存储合并物品的总成本，初始化为 0
    ll cost = 0;
    // 当优先队列 q 中的元素数量大于 1 时，继续合并操作
    while (q.size() > 1) {
        // 取出优先队列 q 中最小的元素，并赋值给变量 x
        ll x = q.top();
        // 从优先队列 q 中移除最小的元素
        q.pop();
        // 取出优先队列 q 中当前最小的元素，并赋值给变量 y
        ll y = q.top();
        // 从优先队列 q 中移除当前最小的元素
        q.pop();
        // 将合并后的物品重量 x + y 重新加入优先队列 q 中
        q.push(x + y);
        // 累加合并操作的成本到变量 cost 中
        cost += x + y;
    }
    // 输出合并物品的总成本
    cout << cost;
    // 程序正常结束，返回 0
    return 0;
}
